﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BST250301TestStand.Models.Helpers
{
    // ----------------------------------------------------------------------
    // 辅助枚举和数据结构
    // ----------------------------------------------------------------------

    public enum CanDirection { Rx, Tx }
    public enum FrameType { Data, Remote }

    /// <summary>
    /// 表示一条 CAN 日志记录的数据结构
    /// </summary>
    public class CanLogEntry
    {
        public string Timestamp { get; set; } // 时间戳 (秒)
        public string BusIndex { get; set; }     // 总线编号 (通常为 1 或 2)
        public string CanId { get; set; }       // CAN ID (十六进制值)
        public string Direction { get; set; } // 方向 (Rx/Tx)
        public string FrameType { get; set; }   // 帧类型 (d/r)
        public string DataDlc { get; set; }     // 数据字节
        public string DataStr { get; set; }     // 数据字节

        public CanLogEntry()
        {
        }
    }

    public static class CanLogGenerator
    {
        private const char Tab = '\t';

        /// <summary>
        /// 生成 ASC 格式的文件头部字符串
        /// </summary>
        public static string GenerateHeader()
        {
            string dateString = $"date {DateTime.Now.ToString("ddd MMM dd hh:mm:ss tt yyyy", CultureInfo.InvariantCulture)}";

            // 注意：实际的 CAN 工具可能要求特定的 locale，这里使用不变区域性
            StringBuilder sb = new StringBuilder();
            sb.AppendLine(dateString);
            sb.AppendLine("base hex timestamps absolute");
            return sb.ToString();
        }

        /// <summary>
        /// 将单个 CanLogEntry 对象转换为符合 ASC 格式的单行文本
        /// </summary>
        /// <param name="entry">要写入的 CAN 报文对象</param>
        /// <returns>符合 ASC 格式的单行字符串</returns>
        public static string GenerateLogLine(CanLogEntry entry)
        {
            if (entry == null) return string.Empty;

            string idStr = $"{entry.BusIndex} {entry.CanId:x}x";

            // 格式: [Timestamp]\t[BusID ID]\t[Dir]\t[Type]\t[DLC]\t[Data]
            return $"{entry.Timestamp}{Tab}{idStr}{Tab}{entry.Direction}{Tab}{entry.FrameType}{Tab}{entry.DataDlc}{Tab}{entry.DataStr}{Tab}";
        }

        /// <summary>
        /// 将日志条目集合写入文件
        /// </summary>
        /// <param name="filePath">输出文件路径</param>
        /// <param name="entries">CAN 报文列表</param>
        public static bool WriteToFile(string filePath, IEnumerable<CanLogEntry> entries)
        {
            try
            {

                using (StreamWriter sw = new StreamWriter(filePath, false, Encoding.ASCII))
                {
                    // 写入头部
                    sw.Write(GenerateHeader());

                    // 写入每条报文
                    foreach (var entry in entries)
                    {
                        sw.WriteLine(GenerateLogLine(entry));
                    }
                }
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }
    }
}